# 工具和游戏主控
import pygame
import random
import os


# 游戏类
class Game:
    def __init__(self, state_dict, start_state):
        self.screen = pygame.display.get_surface()
        self.clock = pygame.time.Clock()
        self.keys = pygame.key.get_pressed()  # 实例化键盘按下keys
        self.state_dict = state_dict  # 接收传入的游戏阶段字典和游戏阶段名称
        self.state = self.state_dict[start_state]

    # 游戏类更新方法
    def update(self):
        # 判断当前阶段是否完结
        if self.state.finished:
            game_info = self.state.game_info  # 接收当前游戏关键数据(生命数等)
            next_state = self.state.next  # 修改下一阶段名变量为当前阶段的next值
            self.state.finished = False  # 阶段完结标志置为False
            self.state = self.state_dict[next_state]  # 当前阶段通过阶段字典和下一阶段名更新为下一阶段
            self.state.start(game_info)  # 传递游戏关键数据到新的游戏阶段
        # 调用当前阶段的更新方法
        self.state.update(self.screen, self.keys)

    # 游戏类运行方法
    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.display.quit()
                    quit()
                elif event.type == pygame.KEYDOWN:
                    self.keys = pygame.key.get_pressed()
                elif event.type == pygame.KEYUP:
                    self.keys = pygame.key.get_pressed()
            # 接收操作后调用游戏类更新方法
            self.update()

            pygame.display.update()
            self.clock.tick(60)


# 载入地图方法(读取地图图片并返回)
def load_graphics(path, accept=('.jpg', '.png', '.bmp', '.gif')):
    graphics = {}
    # os.listdir(path): 返回path指定的文件夹包含的文件或文件夹的名字的列表
    for pic in os.listdir(path):
        # os.path.splitext(path): 分割路径，返回路径名和文件扩展名的元组
        name, ext = os.path.splitext(pic)
        if ext.lower() in accept:
            img = pygame.image.load(os.path.join(path, pic))
            # os.path.join(path1[, path2[, ...]]): 把目录和文件名合成一个路径
            if img.get_alpha():
                img = img.convert_alpha()
            else:
                img = img.convert()
            graphics[name] = img
    return graphics


# 获得图片方法(先生成图片再截取所需部分并返回)
def get_image(sheet, x, y, width, height, colorkey, scale):
    image = pygame.Surface((width, height))
    image.blit(sheet, (0, 0), (x, y, width, height))
    # 0,0 代表画到哪个位置， x,y,w,h 代表sheet里哪个区域要取出来
    image.set_colorkey(colorkey)  # 要设置透明色，使用Surface.set_colorkey函数
    # pygame.transform.scale:快速缩放图像
    image = pygame.transform.scale(image, (int(width * scale), int(height * scale)))
    return image
